//Prevents the modification of existing property attributes and values, and prevents the addition of new properties.
//冻结一个对象。不能添加新的属性，不能删除已有属性，不能修改该对象已有属性的可枚举性、可配置性、可写性，以及不能修改已有属性的值。冻结一个对象后该对象的原型也不能被修改。
let o = {a:1};
Object.freeze(o)
o.b = 234;
console.log(o); //{ a: 1 }
console.log(o.b); //undefined
o.a=2
console.log(o); //{ a: 1 }

//Prevents the modification of attributes of existing properties, and prevents the addition of new properties.
//封闭一个对象。不能添加新属性，不能删除已有属性，不能修改该对象已有属性的可枚举性、可配置性、可写性，已有属性的值以然可以修改。(也就是说descriptor里的writable变成没有变，configurable变成false了)
let o2 = {a: 1};
Object.seal(o2);
o2.b = 234;
o2.a = 2;
console.log(o2); //{ a: 2 }

/**
 * 在React17之前 React规定React元素是不可变的
 */
/*
let element = {type:'h1'};
Object.freeze(element);
element.something = 'something';
console.log(element.something);

// 其实现为↓
Object.defineProperty(Object,'freeze',{
  value:function(obj){
    var i;
    //遍历属性和方法
    for(i in obj){
      if(obj.hasOwnProperty(i)){
        Object.defineProperty(obj,i,{
          //把所有的属性改为不可修改 只读
          writable:false
        });
      }
    }
    //让此对象不能添加额外的属性
    Object.seal(obj);
  }
});
*/
